package com.hyper_yang.javase.collections.set_collection.hashSet;

import com.hyper_yang.javase.collections.pojo.Student;

import java.util.HashSet;

public class TryHashSet {
    /*
        HashSet 底层采用哈希表存储数据 int index = (array.length -1) & 哈希值;
        哈希表    jdk 8 before: 数组 + 链表
                       after: 数组 + 链表 + 红黑树 (当链表长度超过 8，而且数组长度 >= 64, 自动转换成红黑树)
        哈希值: 根据 hashcode 方法算出来的 int类型的整数   可能存在哈希碰撞（概率低）
               方法定义在 object类中 默认使用地址值进行计算，可重写 hashcode方法，利用对象内部的属性值计算哈希值
               所以，如果集合中存储自定义对象，最好重写 equals()、hashCode() 方法
     */
    public static void main(String[] args) {

        // 属性值相同就认为是同一个人
        Student stu1 = new Student("张三",23);
        Student stu2 = new Student("李四",24);
        Student stu3 = new Student("王五",25);
        Student stu4 = new Student("张三",23);

        HashSet<Student> hashSet = new HashSet<>(); // map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));

        hashSet.add(stu1);
        hashSet.add(stu2);
        hashSet.add(stu3);
        hashSet.add(stu4);

        System.out.println(hashSet); // String Interger 等（基本）引用数据类型 java已经重写hashcode() equals()


        // 1: HashSet为什么存和取的顺序不一样？ 遍历顺序: 先根据哈希值查找，有链表遍历链表，由于哈希值随机，所以并不能保证顺序
        // 2: HashSet为什么没有索引？ 底层比较复杂，多种数据结构，不好定义索引
        // 3: HashSet是利用什么机制保证数据去重的？ hashcode()、equals()两个方法保证

        // 常用调试工具 debug、@sl4fj log.info()、apifox、postman 对于 cors  响应头设置了什么来确保相应成功？？

//        Student stu1 = new Student("张三",23);
//        Student stu2 = new Student("李四",24);
//        Student stu3 = new Student("王五",25);
//        Student stu4 = new Student("张三",23);

        System.out.println(stu1.hashCode()); // 24022543
        System.out.println(stu2.hashCode()); // 26104876
        System.out.println(stu3.hashCode()); // 29050001
        System.out.println(stu4.hashCode()); // 24022543
    }
}
